/**
 * 获取当天剩余秒数
 * @returns  123123秒
 */
export function getRemainSecondInDay() {
    const now = new Date();
    // 获取当天结束的时间戳 (23:59:59)
    const endOfDay = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate() + 1,
        0,
        0,
        0,
        0,
    );
    // 计算剩余毫秒数
    const remainingMs = endOfDay.getTime() - now.getTime();
    // 转换为秒
    return Math.floor(remainingMs / 1000);
}

/**
 * 获取当前日期时间字符串
 * 格式：yyyy-MM-dd HH:mm:ss
 */
export function getCurrentDateTime() {
    const now = new Date();
    return formatDate(now, 'yyyy-MM-dd HH:mm:ss');
}

/**
 * 格式化日期对象
 * @param date Date 对象
 * @param format 格式字符串，例如：yyyy-MM-dd HH:mm:ss
 */
export function formatDate(date, format) {
    const map = {
        yyyy: date.getFullYear(),
        MM: (date.getMonth() + 1).toString().padStart(2, '0'),
        dd: date.getDate().toString().padStart(2, '0'),
        HH: date.getHours().toString().padStart(2, '0'),
        mm: date.getMinutes().toString().padStart(2, '0'),
        ss: date.getSeconds().toString().padStart(2, '0'),
        SSS: date.getMilliseconds().toString().padStart(3, '0'),
    };

    return format.replace(/yyyy|MM|dd|HH|mm|ss|SSS/g, (key) =>
        map[key].toString(),
    );
}

/**
 * 获取当前日期字符串
 * 格式：yyyy-MM-dd
 */
export function getCurrentDate() {
    const now = new Date();
    return formatDate(now, 'yyyy-MM-dd');
}

/**
 * 获取当前时间字符串
 * 格式：HH:mm:ss
 */
export function getCurrentTime() {
    const now = new Date();
    return formatDate(now, 'HH:mm:ss');
}

/**
 * 日期加减运算
 * @param date 原始日期
 * @param days 增加或减少的天数
 */
export function addDays(date, days) {
    const result = new Date(date);
    result.setDate(result.getDate() + days);
    return result;
}

/**
 * 比较两个日期
 * @param date1 第一个日期
 * @param date2 第二个日期
 * @returns 1 如果 date1 > date2, -1 如果 date1 < date2, 0 如果相等
 */
export function compareDates(date1, date2) {
    if (date1.getTime() > date2.getTime()) return 1;
    if (date1.getTime() < date2.getTime()) return -1;
    return 0;
}

/**
 * 判断是否是闰年
 * @param year 年份
 */
export function isLeapYear(year) {
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
}

/**
 * 获取某个月的天数
 * @param year 年份
 * @param month 月份（1-12）
 */
export function getDaysInMonth(year, month) {
    return new Date(year, month, 0).getDate();
}

/**
 * 将时间字符串解析为 Date 对象
 * @param dateStr 时间字符串，格式：yyyy-MM-dd HH:mm:ss
 */
export function parseDate(dateStr) {
    if (!dateStr || typeof dateStr !== 'string') {
        return new Date(NaN); // 返回无效日期
    }
    
    const [datePart, timePart] = dateStr.split(' ');
    if (!datePart) {
        return new Date(NaN);
    }
    
    const [year, month, day] = datePart.split('-').map(Number);
    const [hour = 0, minute = 0, second = 0] = timePart
        ? timePart.split(':').map(Number)
        : [];
    return new Date(year, month - 1, day, hour, minute, second);
}

/**
 * 计算两个日期之间的天数
 * @param date1 第一个日期
 * @param date2 第二个日期
 */
export function diffInDays(date1, date2) {
    const timeDiff = Math.abs(date2.getTime() - date1.getTime());
    return Math.ceil(timeDiff / (1000 * 60 * 60 * 24));
}

/**
 * 获取指定日期是周几
 * @param date 日期对象
 * @returns 周几字符串，例如 "星期一"
 */
export function getDayOfWeek(date) {
    const days = [
        '星期日',
        '星期一',
        '星期二',
        '星期三',
        '星期四',
        '星期五',
        '星期六',
    ];
    return days[date.getDay()];
}

// 获取当前日期时间
//console.log(getCurrentDateTime()); // 输出：2024-12-11 15:30:45

// 格式化日期
const date = new Date();
//console.log(formatDate(date, 'yyyy/MM/dd HH:mm:ss')); // 输出：2024/12/11 15:30:45

// 日期加减
const tomorrow = addDays(new Date(), 1);
//console.log(formatDate(tomorrow, 'yyyy-MM-dd')); // 输出：2024-12-12

// 比较日期
const date1 = new Date('2024-12-10');
const date2 = new Date('2024-12-11');
//console.log(compareDates(date1, date2)); // 输出：-1

// 判断闰年
//console.log(isLeapYear(2024)); // 输出：true

// 获取某月天数
//console.log(getDaysInMonth(2024, 2)); // 输出：29

// 解析时间字符串
//console.log(parseDate('2024-12-11 15:30:45')); // 输出：Date 对象

// 计算日期差
//console.log(diffInDays(new Date('2024-12-01'), new Date('2024-12-11'))); // 输出：10

// 获取周几
//console.log(getDayOfWeek(new Date(getCurrentDate()))); // 输出：星期三
